آشنایی با مهم ترین الگوهای طراحی نرم افزار
الگوهای طراحی شیءگرا نوعاً نشاندهندۀ روابط و تعاملها بین کلاسها و شیءها هستند، بدون اینکه کلاسها یا اشیا نهایی برنامه را مشخص کند. الگوهایی که در خود وضعیتهای تغییرپذیر دارند، شاید مناسب زبانهای برنامهنویسی تابعی نباشند. همچنین، در بعضی از زبانها که برای حل یک مسئله راهحلهای آمادۀ از پیش تعریفشده وجود دارد، استفاده از بعضی الگوها برای حل مسئلۀ مشابه میتواند لازم نباشد. به همین ترتیب، الگوهای طراحی شیءگرا ممکن است برای زبانهای غیر شیءگرا مناسب نباشند. الگوهای طراحی میتوانند سرعت فرآیند توسعۀ نرمافزار را با فراهم آوردن الگوهای توسعۀ اثباتشده و مورد آزمون قرار گرفته افزایش دهند. طراحی نتیجهبخش نرمافزار نیازمند در نظر گرفتن پیامدهایی است که ممکن است هنوز در پیادهسازی قابل رؤیت نباشند، اما بعدها خود را نشان خواهند داد. استفاده از الگوهای طراحی کمک میکند تا از بروز خطاهای کوچک که ممکن است مشکلات بزرگی را ایجاد کنند، جلوگیری شود و علاوه بر آن، خوانایی کد را برای کدنویسان و معمارانی که با الگوها آشنا هستند، افزایش میدهد.
برای دستیافتن به انعطافپذیری در نرمافزار، الگوهای طراحی اغلب اعمال را به صورت غیرمستقیم انجام میدهند. این کار در شرایطی ممکن است طراحی حاصل را پیچیده کند و باعث افت کارایی برنامه شود. طبق تعریف، برای استفاده از الگوها در هر برنامهای که از آنها استفاده میکند، باید از نو برنامهنویسی کرد. از آنجایی که بعضی از نویسندگان این نکته را مخالف با en:Code reuse آنگونه که توسط مهندسی نرمافزار بر پایه پیکرپار فراهم میشود، میبینند، پژوهشگران تلاش کردهاند تا الگوها را به پیکرپارها تبدیل کنند. میر و آرنوت توانستند دو سوم الگوهایی را که رویشان کار میکردند، به صورت کامل یا جزئی به پیکرپار تبدیل کنند. تکنیکهای طراحی نرمافزار را به سختی میتوان در گسترۀ وسیعتری از مسائل به کار برد. الگوهای طراحی راهحلهایی کلی را در قالبی بیان میکنند که وابسته به مسئلۀ مخصوصی نیست.
الگوی آداپتور
در مهندسی نرمافزار، الگوی آداپتور (الگوی وفق دهنده) یک الگوی طراحی نرمافزار است که به رابط یک کلاس اجازه میدهد تا توسط رابط دیگری مورد استفاده قرار گیرد. معمولاً با این هدف مورد استفاده قرار می گیرد که بدون تغییر در کد منبع، بتوان استفاده از کلاس های فعلی را مقدور ساخت. یک آداپتور به دو رابط ناسازگار اجازه میدهد تا بتوانند با هم کار کنند. این یک تعریف کلی از مفهوم آداپتور است. ممکن است رابط ها ناسازگار باشند ولی قابلیت درونی آنها باید سازگار با نیاز باشد. الگوی طراحی آداپتور از طریق تبدیل رابط یک کلاس به رابط مورد انتظار توسط کلاینت، به کلاسهای ناسازگار اجازه میدهد تا بتوانند از قابلیتهای همدیگر استفاده کنند.
الگوی آذینگر
در برنامهنویسی شئ گرا، الگوی آذینگر یا دکوراتر (decorator) یک الگوی طراحی است که امکان افزودن رفتار (behavior) به یک شئ، را بهطور پویا (dynamic) یا ایستا (static) فراهم میسازد بی آنکه رفتار اشیاء دیگر از همان کلاس (که شئ مورد بحث از آن ساخته شده) دستخوش تغییر شوند. الگوی طراحی آذینگر معمولاً برای پایبندی به قاعده تک وظیفهای مورد استفاده قرار میگیرد چرا که این الگوی طراحی، امکان تقسیم عملکردها (functionality) بین کلاسهای مختلف که هر کدام دغدغههای (concern) خاص را پوشش میدهند، فراهم میسازد. به منظور گسترش (آذین کردن) عملکرد یک شئ به صورت ایستا یا بعضی مواقع به صورت پویا، در زمان اجرا(Runtime) و بهطور مستقل از اشیاء دیگر همان کلاس، از الگوی طراحی آذینگر استفاده میشود. این مهم از طریق ایجاد یک کلاس آذینگر یا کلاس پیچه، که کلاس اصلی (کلاسی که میخواهیم عملکردش را آذین کنیم)، در آن پیچیده میگردد، برقرار میشود. این عمل پیچیدن کلاس اصلی در کلاس آذینگر از طریق مراحل زیر انجام میشود:
- ساخت یک زیر کلاسِ آذینگر از کلاس اصلی
- اضافه کردن یک اشارهگر به صورت فیلد (field) که به کلاس اصلی اشاره میکند.
- ارسال یک شئ از طریق سازنده (constructor) به فیلد برای مقدار دهی به اشارهگر.
- در کلاس آذینگر از تمام متدهای(Method) کلاس آذینشده یا همان کلاس اصلی باید استفاده کرد.
- در کلاس آذینگر، هر متد از کلاس اصلی را که میبایست عملکردش اصلاح شود (گسترش یابد) باید override کرد.
الگوی استخر اشیاء
در برنامهنویسی، استخر اشیاء یکی از الگوهای طراحی نرمافزار است. یک استخر اشیاء مجموعهای از اشیاء ایجاد شدهاست که آماده برای استفاده نگهداشتهشدهاند به جای اینکه بنابر تقاضا اختصاص و تخریب شوند. یک درخواستدهنده استخر یک شئ را از استخر درخواست میکند و عملیاتی را بر روی شئ بازگردانیده شده انجام میدهد. وقتی که درخواستدهنده شئ کارش را با یک شئ تمام کرد، آن را به استخر باز میگرداند به جای اینکه آن را از بین ببرد. استخر اشیاء را میتوان نوع خاصی از کارخانه شئ دانست.
الگوی استراتژی
در برنامهنویسی کامپیوتر الگوی استراتژی (همچنین به عنوان الگوی سیاست شناخته میشود) است یک الگوی طراحی نرمافزار رفتاری است که قابلیت انتخاب یک الگوریتم در زمان اجرا را ممکن میسازد. الگوی استراتژی اجازه میدهد تا الگوریتمهای متفاوت بهطور مستقل از مشتریان استفادهکننده اجرا شوند. الگوی استراتژی یکی از الگوهای موجود در کتاب مشهور الگوهای طراحی است که توسط گاما و دیگران نوشته شدهاست و مفهوم استفاده از الگوهای طراحی برای توصیف نحوه طراحی انعطافپذیر و قابل استفاده مجدد شی گرا در نرمافزار را محبوب ساخت.
الگوی بازدیدگر
در برنامهنویسی شی گرا و مهندسی نرمافزار، الگوی طراحی بازدیدگر راهی برای جدا کردن یک الگوریتم از ساختار شی است که روی آن عمل میکند. یک نتیجه عملی این جدایی توانایی برای اضافه کردن عملیات جدید به ساختارهای شی موجود بدون تغییر ساختار آن است که یک راه برای تبعیت از اصل باز/بسته میباشد. بهطور خلاصه، بازدید کننده اجازه افزودن توابع مجازی به یک خانواده از کلاسها بدون تغییر خود کلاسها را میدهد. به جای آن یک کلاس بازدیدگر ایجاد میشود فعالیت مخصوص توابع مجازی را پیادهسازی میکند.
الگوی پل
الگوی پل، یک الگوی طراحی در مهندسی نرمافزار است که به معنای "جداسازی یک انتزاع از اجرای آن به طوری که این دو بتوانند به صورت مستقل تغییر پذیر باشند."میباشد. این الگو توسط باند چهار نفره (GoF) معرفی شده است. الگوی پل از گروههای قالبدار و گروههای تجمعی و بعضاً ارثبری برای جداسازی مسئولیتها در طبقات مختلف استفاده میکند. هنگامی که یک کلاس اغلب تغییر میکند، ویژگیهای برنامهنویسی شی گرا بسیار مفید خواهد بود، چرا که تغییرات در کد برنامه، میتواند با حداقل اطلاعات از برنامه صورت گیرد. زمانی که کلاسها و کاری که آنها انجام میدهند نسبت به یگدیگر تفاوتهای زیادی داشته باشد، از الگوی پل استفاده میشود. خود کلاس به عنوان انتزاع در نظر گرفته میشود و کاری که انجام میدهد در مرحله پیادهسازی آن است. همچنین الگوی پل میتواند به عنوان دو لایه از انتزاع در نظر گرفته شود. زمانی که تنها یک پیادهسازی ثابت امکانپذیر است در زبان C++ این الگو در اصطلاح Pimpl شناخته میشود. الگوی پل اغلب با الگوی آداپتور اشتباه گرفته میشود. در واقع، الگوی پل اغلب در زبان جاوا توسط کلاس الگوی آداپتور پیادهسازی میشود. مانند مثالی که در ادامه آمده است.
الگوی تکرار
الگوی تکرار (Iterator pattern) یا الگوی تکرارگر، در برنامهنویسی شیءگرا از الگوهای طراحی است که در آن یک تکرارگر با هدف عبور از یک مجموعه داده و دسترسی به عناصر آن مجموعه، مورد استفاده قرار میگیرد. ماهیت الگوهای تکرارگر اغلب فراهم نمودن راهی برای دسترسی پیوسته به عناصر یک مجموعه داده و جدا نمودن الگوریتمها، بدون آگاهی از ساختار یا فاش کردن محتویات آن مجموعه میباشد.
الگوی ثبت کنشور
الگوی ثبت کُنشور Active record pattern الگوی طراحیای است که معمولاً در نرمافزارهایی که از پایگاههای داده رابطهای برای ذخیره دادههای خود بهره میبرند به کار میرود. ثبت کنشور روشی برای دستیابی دادهها از درون پایگاه داده است. یک جدول پایگاه داده یا نما توسط یک کلاس همپوشانی میشود، بنابراین یک نمونه از شی برای یک سطر یکتا در جدول گره میخورد. پس از ساخت یک شی، سطر جدیدی به جدول افزوده میشود. هر شیای که بارگذاری میشود اطلاعات خود را از پایگاهداده میگیرد. هنگامی که شیای بهروز میشود، سطر متناظرآن جدول نیز بهروز میشود. کلاس همپوشان متدها یا خواص دستیابی برای هر ستون در جدول را پیادهسازی میکند.: این الگو معمولاً توسط ابزارهای پایدار شی یا object persistence tools و در نگاشت رابطهای شی یا object-relational mapping بهکار میرود. معمولاً روابط کلیدخارجی همچون نمونه شیای که دارای نوع مناسب است توسط یک خاصیت نشان داده میشوند. پیادهسازی ثبت کنشور را میتوان در فریمورکهای گوناگون و محیطهای برنامهنویسی بسیاری یافت. برای نمونه، اگر در یک پایگاهداده جدولی با نام parts با ستونهای name (از نوع رشتهای) و price (از نوع صحیح) وجود داشته باشد. الگوی ثبت کُنشور در کلاسی با نام part پیادهسازی میشود.
الگوی خلاقیت
الگوی خلاقیت (Creational pattern) در مهندسی نرمافزار، به نوعی از الگوهای طراحی نرمافزاری اطلاق میگردد، که با مکانیسمهای ایجاد و خلق اشیاء سروکار دارند و سعی دارند تا اشیاء را به روشی متناسب با موقعیت شیء مورد نظر، ایجاد نمایند. در این فرایند شکل اصلی ایجاد اشیاء میتواند منجر به بروز مشکلاتی در طراحی یا اعمال پیچیدگی بیشتر، در طراحی گردد، که الگوهای خلاقیت این مشکلات را با اعمال نوعی از کنترل بر فرایند ایجاد اشیاء حل مینمایند. الگوهای خلاقیت اغلب به الگوهای خلاقیت اشیاء و الگوهای کلاس-خلاقیت تفکیک میشوند. ۵ الگوی طراحی شناختهشده که جزئی از الگوهای خلاقیت محسوب میشوند، شامل: الگوی کارخانه انتزاعی، الگوی سازنده، الگوی متد کارخانه شیء، الگوی نمونه اولیه و الگوی یگانه میباشند.
الگوی رفتاری
در مهندسی نرمافزار، الگوهای طراحی رفتاری آن دسته از الگوهای طراحی هستند که الگوهای ارتباطی مشترک را بین اشیاء شناسایی کرده و آنها را تحقق میبخشند. با انجام این کار، این الگوها انعطافپذیری در برقراری این ارتباط را افزایش میدهند.
الگوی زنجیره مسئولیت
در طراحی شی گرا الگوی زنجیره مسئولیت یک الگوی طراحی متشکل از یک منبع از اشیای فرمانده و یک سری از اشیای پردازشی است هر شی پردازشی شامل منطقی است که انواع اشیایی فرمان را میتواند پردازش کند؛ بقیه به شی پردازشی بعدی در زنجیره فرستاده میشوند. یک مکانیزم نیز برای اضافه کردن شی پردازشی جدید به پایان این زنجیره نیز وجود دارد؛ بنابراین زنجیره مسئولیت نسخه شیگرایانه if … else if … else if ....... else … endif است. به علاوه این مزیت را دارد که میتوان آن را در هنگام اجرا تغییرشکل داد. زنجیره مسئولیت الگوی ساختاری تقریباً یکسان با الگوی آذینگر است با این تفاوت که برای آذینگر همه کلاسها میتوانند یک درخواست را رسیدگی کنند در حالی که در الگوی زنجیره مسئولیت فقط یکی از کلاسها در زنجیره به درخواست رسیدگی میکند.
الگوی سازنده
الگوی سازنده یک الگوی مهندسی نرمافزار به منظور ایجاد اشیا میباشد. این الگو بر خلاف الگوی کارخانه انتزاعی ( abstract factory pattern ) و الگوی روش کارخانه ( factory method pattern ) که به منظور رعایت پدیدۀ چندریختی ( polymorphism ) ایجاد شدهاند به منظور حل وجۀ دیگری از مشکل ساخت و تنظیم اشیا در برنامهنویسی معرفی شدهاست. مشکل بدین شرح است که گاهی نیاز است هنگام ساخت یک شی تعداد زیادی پارامتر را به سازندۀ ( constructor ) آن تحویل دهیم و این کار خوانایی برنامه را کم میکند . به منظور حل این مشکل از الگوی سازنده استفاده میکنیم. در این الگو به جای طراحی تعدادی سازنده ( constructor ) با تعداد زیادی پارامتر ، از یک شی دیگر استفاده میکنیم که کار پارامتر دهی را به صورت مرحله به مرحله و خوانا تر انجام میدهد و در نهایت از نوع شی مورد نظر یک نمونه با تنظیمات خواسته شده به ما تحویل میدهد. معمولاً یک طراح در سیر طراحی٬ ابتدا با الگوی روش کارخانه ( factory method ) شروع میکند سپس به الگوی کارخانه انتزاعی ( abstract factory ) یا الگوی نمونهٔ اولیه ( prototype ) یا سازنده ( builder ) متوسل میشود . معمولاً هنگامی به الگوی سازنده متوسل میشویم که در فرایند طراحی به انعطافپذیری بیشتر نیاز پیدا میکنیم.
الگوی فرمان
الگوی فرمان (Command pattern) یا الگوی دستور، از الگوهای طراحی رفتاری در برنامهنویسی شیءگرا است، که در آن از یک شیء بهمنظور نهانسازی اطلاعات مورد نیاز برای انجام یک عمل یا اجرای رویدادی در زمان آینده، استفاده میشود. این اطلاعات شامل؛ نام روش، شیء مالک روش و مقادیر پارامترهای مربوط به روش میباشد. بخشهای مرتبط با الگوی فرمان اغلب از چهار بخش؛ دستور فرمان، گیرنده فرمان، معرف فرمان و کاربر تشکیل میشود.
الگوی کارخانه انتزاعی
الگوی کارخانه انتزاعی، در الگوهای نرمافزاری روشی برای جمعبندی گروهی از کارخانههای مجازی است که ساختار مشابهی دارند ولی از کلاسهای مختلفی تشکیل شدهاند . در حالت عادی، برنامه زیرشاخه یک ساختار یکپارچه از کارخانه انتزاعی را میسازد و سپس از واسط کاربری میخواهد که شیءهای مختلفی در آن تم (دارای شباهت در تعدادی از ویژگیها) بسازد. برنامه زیر شاخه نمیداند (یا اهمیت نمیدهد) که چه شیءای را از کتابخانه گرفته است. چون تنها از شی ساخته شده استفاده میکند. این الگو جزییات اجرا و استفاده از گروهی از اشیاء را، از نحوه پیادهسازی آنها جدا میکند. چرا که ساخت اشیاء در کارخانه صورت میگیرد. به طور مثال کلاس کتابخانه انتزاعی DocumentCreator که رابطی برای ساخت تعدادی از کتابخانهها (ازجمله createLetter و createResume) را فراهم میکند. این سامانه میتواند به هر تعداد از نسخههای کتابخانههای مشتق شده از کلاس DocumentCreator را داشته باشد. مثل FancyDocumentCreator یا ModernDocumentCreator هر کدام با یک پیادهسازی متفاوت از createLetter و createResume شیهای مربوطه را تولید کنند. و هر کدام از یک کلاس انتزاعی ثابتی مانند Letter یا Resume ساخته میشوند. برنامه زیرشاخه یک ساخته از DocumentCreator را دریافت میکند که به آن کارخانه انتزاعی گفته میشود. اشیاء ساخته شده همگی توسط یک DocumentCreator ساخته میشوند و ساختار مشابهی خواهند داشت. برنامه زیرشاخه تنها نیاز است بداند که چگونه یک کلاس از نوع Letter یا Resume را که از کارخانه میگیرد استفاده کند. کارخانه محل کلاسهای متشابه داخل کد که اشیاء از آنها ساخته میشوند میباشد. هدف پیادهسازی الگو جداسازی ساخت اشیاء از استفاده آنها و ساخت خانوادههایی از اشیاء مرتبط بدون نیاز به وابستگی به نوع کلاس آنهاست.
الگوی میانجی
در مهندسی نرمافزار الگوی میانجی تعریف یک شی است که روابط مجموعهای از اشیاء را تهیه و تعیین میکند. این الگو به خاطر آن که میتواند رفتار برنامه را در حین اجرا تغییر دهد، به عنوان یک الگوی رفتاری شناخته میشود. برنامهها معمولاً از تعداد زیادی کلاس تشکیل میشوند. در نتیجه منطق برنامه و محاسبات آن بین این کلاسها توزیع میشوند. اما، در حالی که در مرحله نگهداری یا بازسازی کد تعداد کلاسها بیشتر میشوند، مشکل ارتباط بین این کلاسها ممکن است پیپیدهتر شود. این باعث دشواری بیشتر در خواندن و حفظ کد میشود. همچنین تغییر برنامه، به خاطر آن که هر تغییر باعث تغییر تعداد زیادی از کلاسهای دیگر میشود، سختتر خواهد شد. با کمک الگوی میانجی، ارتباط بین اشیاء در یک شیء میانجیگر محدود میشود. در نتیجه اشیاء بجای این که مستقیم با یکدیگر ارتباط برقرار کنند، ارتباطات خود را از طریق میانجیگر انجام میدهند. این باعث کاهش ارتباطات بین اشیاء شده و در نتیجه جفتگری (coupling) کاهش مییابد. الگوی ناظر یک الگوی طراحی نرمافزار است که در آن یک شی به نام موضوع، فهرست وابستگیهایش را با نام ناظران نگه میدارد و هرگونه تغییر در وضعیتش را بهطور خودکار و معمولاً با صدا کردن یکی از روشهای آن به اطلاع آن اشیا میرساند. این الگو معمولاً برای پیادهسازی سامانههای توزیعشده رسیدگی رویداد در نرمافزارهای «رویداد محور» استفاده میشود. اکثر زبانهای مدرن مانند C# سازندگان درونیشده «رویداد» را دارند که الگوی ناظر را پیادهسازی میکند تا برنامهنویسی آسان و کد کوتاه شود. الگوی ناظر همچنین بخش مهمی در الگوی معماری مدل-نما-کنترلگر (MVC) دارد. الگوی ناظر در بسیاری از کتابخانههای و سامانههای برنامهنویسی و تقریباً تمام تولکیتهای GUI پیادهسازی شدهاست.
الگوی نمونه اولیه
الگوی نمونه اولیه یکی از الگوهای طراحی در توسعه نرمافزار است. وقتی نوع اشیاء ساخته شونده با یک نمونه اولیه مشخص شود، از این الگو استفاده شدهاست؛ که در واقع یک مورد مشابه از خود ساخته است یا به اصطلاح خودسازی کردهاست. موارد استفاده از این الگو:
جلوگیری از وجود کلاس فرزند از یک کلاس سازنده اشیاء در نرمافزار مشتری همان طوری که الگوی کارخانه انتزاعی عمل میکند.
جلوگیی از هزینه وراثتی ساخت شیء جدید در روش معمول آن (به عنوان مثال با استفاده از دستور 'new') چرا که در برنامهها این کار از نظر پردازشی پرهزینه خواهد بود.
برای پیادهسازی الگو، یک کلاس پایه انتزاعی که یک تابع مجازی خودسازنده ('clone') دارد در نظر میگیریم. هر کلاسی که قابلیت ساخت اشاء جدید را داشته باشد از کلاس اولیه ارث برده و دستور خودسازی ('clone') را میسازد.
مشتری به جای نوشتن کدی که فراخوانی ساخت شی جدید ('new') را اجرا میکند، دستور خودسازی ('clone') را از نمونه اولیه فراخوانی میکند. یا یککارخانه را با یک پارامتر تعیینکننده نوع کلاس مشتق شونده صدا میکند یا دستور خودسازی را از یک سری روشهای به وجود آمده در یک الگوی طراحی دیگر اجرا میکند.
الگوی یگانه
الگوی یگانه یک الگوی طراحی در مهندسی نرمافزار است. این الگو ایجاد شیء از یک کلاس را محدود میسازد. این الگو زمانی مفید است که در سرتاسر سیستم تنها به یک نمونه از آن کلاس نیاز باشد. این مفهوم عموماً به سیستمهایی که با یک یا تعداد محدودی نمونه بهینهتر کار میکنند، نیز تعمیم داده میشود. واژه آن از مفهوم ریاضی یگانه (Singleton) برگرفته شده است. انتقادهایی به استفاده از الگوی یگانه وجود دارد. برخی آن را یک ضدالگو تلقی میکنند، زیرا بیش از حد استفاده میشود، محدودیتهای نابجایی را زمانی که تنها یک نمونه از کلاس لزوماً مورد نیاز نیست، به وجود میآورد و حالت سراسری را به یک برنامه القا میکند. فریمورکها و سیستمعاملهایی مانند اندروید زمانی که نیازمند تخصیص حافظه به برنامهای دیگر باشند، به صورت غیرمنتظره اقدام به زباله روبی اشیاء یگانه میکنند. الگوهای کارخانه انتزاعی، سازنده و نمونه اولیه میتوانند در پیادهسازیهای خود از الگوی یگانه استفاده کنند.
به این مطلب چند ستاره میدهید؟(امتیاز: 4.8 - رای: 2)
- منبع: ماهنامه شبکه
- نویسنده: حمیدرضا تائبی